#include "Correa.h"
#include <iostream>
#include "UnidadLogica.h"
#include "Engranaje.h"
#include <math.h>

Correa::Correa(double x, double y, double ancho, double alto, string pathImagen) :
		Elemento(x, y, ancho, alto, pathImagen) {
	this->ancho = (ancho * 2) / 3;
	this->alto = (alto * 2) / 3;
	cantClicks = 0;
	this->inicioCorrea.first = 0;
	this->inicioCorrea.second = 0;
	this->finCorrea.first = 0;
	this->finCorrea.second = 0;
	this->elementoInicial = NULL;
	this->elementoFinal = NULL;
	this->frameActual = 1;
	this->cantFrames = 6;
}

Correa::~Correa() {
	if (this->elementoInicial)
		this->elementoInicial->eliminarCorrea();
	if (this->elementoFinal)
		this->elementoFinal->eliminarCorrea();
}

void Correa::mover(double x, double y) {
	if (this->cantClicks == 0) {
		Elemento::mover(x, y);
		return;
	}
	this->finCorrea.first = x;
	this->finCorrea.second = y;
}

int Correa::seSuperpone(Elemento* elemento) {
	if (!elemento->aceptaCorrea())
		return 2;
	return 1;
}

void Correa::superponer(Elemento* elemento) {
	if (!this->elementoInicial) {
		this->elementoInicial = elemento;
		elemento->agregarCorreaInicial(this);
	} else if (!this->elementoFinal) {
		this->elementoFinal = elemento;
		elemento->agregarCorreaFinal(this);
	}
}

bool Correa::dejarEnCanvas(double x, double y) {
	cantClicks++;
	if (cantClicks == 2) {
		cantClicks = 2;
		this->finCorrea.first = x;
		this->finCorrea.second = y;

		return true;
	}
	this->inicioCorrea.first = x;
	this->inicioCorrea.second = y;
	this->finCorrea.first = x;
	this->finCorrea.second = y;
	SDL_FreeSurface(surfaceElemento);
	SDL_DestroyTexture(texturaElemento);
	surfaceElemento = NULL;
	texturaElemento = NULL;
	this->pathImagen = "img/correaCostado.png";
	return false;
}

void Correa::dibujar(double x, double y, double largo, double ancho,
		SDL_Renderer* renderer) {

	if (this->cantClicks == 0) {
		Elemento::dibujar(x, y, largo, ancho, renderer);
		return;
	}

	if (texturaElemento == NULL) {
	//	cout << "nueva texturay y surfaceeeee" << this->pathImagen << endl<<endl;
		surfaceElemento = IMG_Load(this->pathImagen.c_str());
		texturaElemento = SDL_CreateTextureFromSurface(renderer,
				surfaceElemento);

		if (texturaElemento == NULL) {
			std::cout << "SDL_CreateTextureFromSurface Error: "
					<< SDL_GetError() << std::endl;
			return;
		}
	}

	UnidadLogica* unidadLogica = UnidadLogica::obtenerInstancia();

	pair<double, double> conversionPixElementoInicial =
			unidadLogica->convertirULAPixel(
					this->elementoInicial->getX()
							+ this->elementoInicial->getAncho() / 2,
					this->elementoInicial->getY());

	pair<double, double> conversionPixElementoFinal;

	if (this->elementoFinal == NULL) {
		conversionPixElementoFinal = unidadLogica->convertirULAPixel(
				this->finCorrea.first, this->finCorrea.second);
	} else {
		conversionPixElementoFinal = unidadLogica->convertirULAPixel(
				this->elementoFinal->getX()
						+ this->elementoFinal->getAncho() / 2,
				this->elementoFinal->getY());
	}

	double distanciaX = conversionPixElementoFinal.first
			- conversionPixElementoInicial.first;
	double distanciaY = conversionPixElementoFinal.second
			- conversionPixElementoInicial.second;

	double distancia = sqrt(pow(distanciaX, 2) + pow(distanciaY, 2));

	double angulo = atan2(distanciaY, distanciaX);

	angulo = (angulo * 180.0);
	angulo = (angulo / 3.14159265);

	if (angulo < 0)
		angulo = 360 + angulo;

	SDL_Rect sdlRect;
	sdlRect.w = distancia;
	sdlRect.h = 2;
	sdlRect.x = conversionPixElementoInicial.first;
	sdlRect.y = conversionPixElementoInicial.second;

	SDL_Point centro;
	centro.x = 0;
	centro.y = 0;
	SDL_RenderCopyEx(renderer, texturaElemento, NULL, &sdlRect, angulo, &centro,
			SDL_FLIP_NONE);

	// Hago la soga de abajo
	conversionPixElementoInicial = unidadLogica->convertirULAPixel(
			this->elementoInicial->getX()
					+ this->elementoInicial->getAncho() / 2,
			this->elementoInicial->getY() + this->elementoInicial->getAlto());

	if (this->elementoFinal == NULL) {
		conversionPixElementoFinal = unidadLogica->convertirULAPixel(
				this->finCorrea.first, this->finCorrea.second);
	} else {
		conversionPixElementoFinal = unidadLogica->convertirULAPixel(
				this->elementoFinal->getX()
						+ this->elementoFinal->getAncho() / 2,
				this->elementoFinal->getY() + this->elementoFinal->getAlto());
	}

	distanciaX = conversionPixElementoFinal.first
			- conversionPixElementoInicial.first;
	distanciaY = conversionPixElementoFinal.second
			- conversionPixElementoInicial.second;

	distancia = sqrt(pow(distanciaX, 2) + pow(distanciaY, 2));
	angulo = atan2(distanciaY, distanciaX);

	angulo = (angulo * 180.0);
	angulo = (angulo / 3.14159265);

	if (angulo < 0)
		angulo = 360 + angulo;

	sdlRect.w = distancia;
	sdlRect.h = 2;
	sdlRect.x = conversionPixElementoInicial.first;
	sdlRect.y = conversionPixElementoInicial.second;

	centro.x = 0;
	centro.y = 0;
	SDL_RenderCopyEx(renderer, texturaElemento, NULL, &sdlRect, angulo, &centro,
			SDL_FLIP_NONE);

	anchoPixeles = sdlRect.w;
	altoPixeles = sdlRect.h;
	pair<double, double> anchoYAltoUL = unidadLogica->convertirPixelAUL(
			distancia, 10);
	this->setAncho(anchoYAltoUL.first);
	this->setAlto(anchoYAltoUL.second);
	this->setX(this->inicioCorrea.first);
	this->setY(this->inicioCorrea.second);
}

bool Correa::agregaEnVacio() {
	return false;
}

bool Correa::tieneVertices() {
	return false;
}

void Correa::setPosicionInicial(double x, double y) {
	this->inicioCorrea.first = x;
	this->inicioCorrea.second = y;
}
void Correa::setPosicionFinal(double x, double y) {
	this->finCorrea.first = x;
	this->finCorrea.second = y;
}

pair<Elemento*, Elemento*> Correa::obtenerExtremos() {
	pair<Elemento*, Elemento*> extremosCorrea;
	extremosCorrea.first = this->elementoInicial;
	extremosCorrea.second = this->elementoFinal;
	return extremosCorrea;
}

pair<double, double> Correa::getPosicionInicial() {
	return this->inicioCorrea;
}

pair<double, double> Correa::getPosicionFinal() {
	return this->finCorrea;
}

void Correa::jointearElemento(b2World* world) {
	// tengo que tener 2 engranajes para que ande.
	if (this->obtenerExtremos().first && this->obtenerExtremos().second) {
		//cout << "TENGO LOS 2 ENGRANAJES" << endl;
		EntidadFisica* engranaje1 =
				this->obtenerExtremos().first->getEntidadFisica();
		EntidadFisica* engranaje2 =
				this->obtenerExtremos().second->getEntidadFisica();
		EntidadFisica* correa = this->getEntidadFisica();
		correa->setearElementosAJointear(engranaje1, engranaje2);
		correa->jointear(world);
	} else {
		cout << "le faltan engranajes..." << endl;
	}
}

bool Correa::esBasico() {
	return false;
}

void Correa::agregarCorreaInicial(Elemento* correa) {
	this->elementoInicial = correa;
}
void Correa::agregarCorreaFinal(Elemento* correa) {
	this->elementoFinal = correa;
}

void Correa::inicializarCorreaDibujado(double xini, double yini, double xfin,
		double yfin) {
	this->inicioCorrea.first = xini;
	this->inicioCorrea.second = yini;
	this->finCorrea.first = xfin;
	this->finCorrea.second = yfin;
	surfaceElemento = NULL;
	texturaElemento = NULL;
	this->pathImagen = "img/correaCostado.png";
	this->cantClicks = 2;
}

bool Correa::esAnimable() {
//	cout << "CORREA ES ANIMABLEEEEEEEEEEEEEEE" << endl;
	if (this->elementoInicial && this->elementoFinal ) {
	//	cout << "tiene inicial y final " << endl;
		Engranaje* engranajeIni = (Engranaje*) this->elementoInicial;
		Engranaje* engranajeFin = (Engranaje*) this->elementoFinal;
		if(engranajeIni->estaAndando || engranajeFin->estaAndando ){
		//	cout << "esta andando algun engranahe!" << endl;
			return true;
		}

	}
	return false;


}
bool Correa::sinReferencias(){
	if(this->elementoInicial == NULL && this->elementoFinal == NULL) return true;
	return false;
}

bool Correa::entraEnCinta(list<Elemento*>*lista) {
	return true;
}

bool Correa::tieneElementoInicial() {
	if (this->elementoInicial)
		return true;
	return false;
}

